package com.mastercard.assets.web.struts.actions;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.jpa.TblNivel;
import com.mastercard.assets.jpa.TblProducto;
import com.mastercard.assets.jpa.TblRole;
import com.mastercard.assets.jpa.TblTipoCampania;
import com.mastercard.assets.jpa.TblTipoProducto;
import com.mastercard.assets.jpa.TblUsuario;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.GenerarCampanaRegistrarForm;
import com.mastercard.assets.web.util.to.UserLogin;

public class GenerarCampanaIn
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		
		// en caso de null
		if( user == null )
			return mapping.findForward( "noLogin" ) ;
		
//		System.out.println( "!!!!!!!!!!!!!!!!!!!!!!1" ) ;
//		
    		GenerarCampanaRegistrarForm f = ( GenerarCampanaRegistrarForm ) user.getManejadorCampana( ) ;
                
                System.out.println( "!!!!!!!!!!!!!!!!!!!!!!1 " + f ) ;
		
                
		// en caso de null
		if( f == null )
		{
			return mapping.findForward( "error" ) ;
		}
		
		System.out.println( "!!!!!!!!!!!!!!!!!!!!!!1 " + f.getPaquetesParaCampana( ) ) ;
		System.out.println( "!!!!!!!!!!!!!!!!!!!!!!1 " + f.getPaquetesParaCampana( ).size() ) ;
		
		// en cao de que si haya
		// lo guarda en el requets
		request.setAttribute( "GenerarCampanaRegistrarForm" , f ) ;
		
		// levanta los tipos de campana
		try
		{
//			System.out.println( "!!!!!!!!!!!!!!!!!!!!!!2" ) ;
//			
			List< TblTipoCampania > tipoCampanias = MasterCardDAO.getAllActiveCampaignTypes( ) ;
			
//			System.out.println( "@@@@@@@@@@@22 " + tipoCampanias.size( ) ) ;
//			
			if( tipoCampanias != null && tipoCampanias.size( ) > 0 )
				// los pone en el request
				request.setAttribute( "TipoCampanias" , tipoCampanias ) ;
                        else {
                            MasterCardDAO.closeEntityManager( ) ;
                            return mapping.findForward( "NoCampaignType" ) ;
                        }
				
		}catch( Exception e )
		{
			request.setAttribute( "TipoCampanias" , new ArrayList< TblTipoCampania >( ) ) ;
		}
		
		try
		{
			List< TblTipoProducto > tipoProductos = MasterCardDAO.getAllActiveProductTypes( ) ;
			// guarda en el request
			if( tipoProductos != null && tipoProductos.size( ) > 0 )
				request.setAttribute( "TipoProductos" , tipoProductos ) ;
			else
			{
                            MasterCardDAO.closeEntityManager( ) ;
				return mapping.findForward( "NoTipoProducts" ) ;
			}
		}catch( Exception e )
		{
			request.setAttribute( "Productos" , new ArrayList< TblProducto >( ) ) ;
		}
		
		// toma el parametro de tipo de productos
		String[ ] tipoProductoS = request.getParameterValues( "tipoProducto" ) ;
		// toma todos los productos activos.
		List< TblProducto > productos = new ArrayList< TblProducto >( ) ;
		
		try
		{
			productos = MasterCardDAO.getAllActiveProduct( ) ;
		}catch( Exception e )
		{
                    MasterCardDAO.closeEntityManager( ) ;
			productos = new ArrayList< TblProducto >( ) ;
		}
		
		// en caso de que no sea null
		if( tipoProductoS != null && tipoProductoS.length > 0 )
		{
			// convierte
			int tipoProductos[ ] = new int[ tipoProductoS.length ] ;
			
			for( int i = 0 ; i < tipoProductoS.length ; i++ )
			{
				System.out.println( "gci: tipoProd/" + tipoProductoS[ i ] ) ;
				// convierte
				tipoProductos[ i ] = Integer.parseInt( tipoProductoS[ i ] ) ;
			}	
			
			// recorre los
			// productos totales
			List< TblProducto > productosFinal = new ArrayList< TblProducto >( ) ;
			
			try
			{
				// recorre productos
				for( TblProducto p : productos )
				{
					// para cada producto revisa si es del tipoProducto venido
					// recorre los tipoProductos
					for( int tp : tipoProductos )
					{
						// en csao de 0
						if( tp == 0 )
						{
							// lo incluye
							productosFinal.add( p ) ;
							
							// quiebra el cilo
							break ;
						}
						// en caso d que no sea
						else
						{
							// compara 
							if( p.getTblTipoProducto( ).getCveTipoProducto( ) == tp )
							{
								// agrega
								productosFinal.add( p ) ;
								
								// quiebra el cilo
								break ;
							}
						}
					}// ermina el for para recorrer tiposproducot
					
				}// termina for para recorrer productos
				
				// guarda en el request
				if( productosFinal != null && productosFinal.size( ) > 0 )
					request.setAttribute( "Productos" , productosFinal ) ;
				else
				{
					request.setAttribute( "Productos" , new ArrayList< TblProducto >( ) ) ;
				}
			}catch( Exception e )
			{
				request.setAttribute( "Productos" , new ArrayList< TblProducto >( ) ) ;
			}
		}
		
		try
		{
			// role de banco
			TblRole roleBanco = MasterCardDAO.findRoleById( 3 ) ;
			
			// en caso de que sea null
			if( roleBanco == null )
				return mapping.findForward( "NoRole" ) ;
			
			List< TblNivel > niveles = roleBanco.getTblNivels( ) ;
			
			// guarda en el request
			if( niveles != null && niveles.size( ) > 0 )
			{
				List< TblNivel > nivelesFin = new ArrayList< TblNivel >( ) ;
				
				// recorre niveles
				for( TblNivel nivel : niveles )
				{
					// verifica que no este inactivo
					if( nivel.getStatus( ) == 1 )
						// agrega si no esta inaacivo
						nivelesFin.add( nivel ) ;
				}
				
				request.setAttribute( "Niveles" , nivelesFin ) ;
			}
			else
				request.setAttribute( "Niveles" , new ArrayList< TblNivel >( ) ) ;
		}catch( Exception e )
		{
                    MasterCardDAO.closeEntityManager( ) ;
			request.setAttribute( "Productos" , new ArrayList< TblNivel >( ) ) ;
		}
		
		try
		{
			List< TblUsuario > usuarios = MasterCardDAO.getAllActiveUsersFromBancoRoleAndCount( 
                                user.getActualCountId( ) , user.getTblUsuario( ).getTblPais( ).getCvePais( ) ) ;
			// guarda en el request
			if( usuarios != null )
				request.setAttribute( "Usuarios" , usuarios ) ;
			else
				request.setAttribute( "Usuarios" , new ArrayList< TblUsuario >( ) ) ;
		}catch( Exception e )
		{
			request.setAttribute( "Usuarios" , new ArrayList< TblUsuario >( ) ) ;
		}
		
		f.setCveCuenta( user.getActualCountId( ) ) ;
		
		// sube todos los productos a memoria
		request.setAttribute( "AllProducts" , productos ) ;
                
                MasterCardDAO.closeEntityManager( ) ;
                if( user.getIdioma( ) == 1 ) {
                    return mapping.findForward( "successEng" ) ;
                } else {
                    return mapping.findForward( "success" ) ;
                }
                
	}
	
}
